package org.example.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.example.domain.User2;
import org.example.mapper.DateMapper1;
import org.example.mapper.DateMapper2;

import java.util.List;

/**
 * @author 李新雨的项目86176
 * @version 1.0
 * @date 2024-12-15 12:47
 */

public class UserRealm2 extends AuthorizingRealm {
    //提供认证信息
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
            throws AuthenticationException {
        //页面传入的账号
        String userName = (String) token.getPrincipal();
        //模拟从数据库中查询数据
        User2 user = DateMapper2.getUserByName(userName);
        System.out.println(user.getPassword());
        if(user==null){
            //账号不存在则返回NULL
            return null;
        }else{
            //如果存在需要封装成AuthenticationInfo对象返回
            //// TODO: 2024/12/15
            return new SimpleAuthenticationInfo(
                    user,////身份对象,可以理解为在Web环境中登录成功后需要放入Session中的对象
                    user.getPassword(),//凭证(密码),需要和传入的凭证(密码)做比对
                    ByteSource.Util.bytes(user.getSalt()),
                    this.getName());
        }
    }


    //提供授权信
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //前端传递用户，角色或者权限
        //// TODO: 2024/12/15   获取当前用户，从数据库中查询用户的角色与权限
        //principals.getPrimaryPrincipal()
        //其实就是在认证时放入SimpleAuthenticationInfo的第一个参数
        User2 user = (User2) principals.getPrimaryPrincipal();//当前登录用户
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 根据登录用户的名称查询到其拥有的所有角色的编码
        List<String> roleSns = DateMapper1.getRoleByName(user.getUsername());
        // 将用户拥有的角色添加到授权信息对象中，供 Shiro 权限校验时使用
        info.addRoles(roleSns);
        // 根据登录用户的名称查询到其拥有的所有权限表达式
        List<String> expressions = DateMapper1.getPermissionByName(user.getUsername());
        // 将用户拥有的权限添加到授权信息对象中，供 Shiro 权限校验时使用
        info.addStringPermissions(expressions);
        return info;//
    }
}